package com.hss01248.facedetect;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static android.graphics.BitmapFactory.Options;
import static android.graphics.BitmapFactory.decodeByteArray;
public final class FaceCj {
    private static Options BitmapFactoryOptionsbfo;
    private static ByteArrayOutputStream out;
    private static byte[] data;
    private static FaceDetector.Face[] myFace;
    private static FaceDetector myFaceDetect;

    private static int tx = 0;
    private static int ty = 0;
    private static int bx = 0;
    private static int by = 0;
    private static int width = 0;
    private static int height = 0;
    private static float wuchax = 0;
    private static float wuchay = 0;
    private static FaceDetector.Face face;
    private static PointF myMidPoint;
    private static float myEyesDistance;
    private static List<String> facePaths;
    private static String facePath;
    private static float[] faceSize;

    public static Bitmap cutFace(Bitmap bitmap, Context context) {
        BitmapFactoryOptionsbfo = new Options();
        BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; // 构造位图生成的参数，必须为565。类名+enum
        out = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
        data = out.toByteArray();
        bitmap = decodeByteArray(data, 0, data.length, BitmapFactoryOptionsbfo);
        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        width = bitmap.getWidth();
        height = bitmap.getHeight();
        myFace = new FaceDetector.Face[5]; // 分配人脸数组空间
        myFaceDetect = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 5);
        int numberOfFaceDetected = myFaceDetect.findFaces(bitmap, myFace);
        if (numberOfFaceDetected <= 0) {// FaceDetector构造实例并解析人脸
            bitmap.recycle();
            return null;
        }
        Log.d("face", numberOfFaceDetected + "");


        faceSize = new float[numberOfFaceDetected];
        for (int i = 0; i < numberOfFaceDetected; i++) {
            faceSize[i] = myFace[i].eyesDistance();

        }
        int targetIndex=findMaxIndex(faceSize);

        face = myFace[targetIndex];


        myMidPoint = new PointF();
        face.getMidPoint(myMidPoint);

        myEyesDistance = face.eyesDistance();   //得到人脸中心点和眼间距离参数，并对每个人脸进行画框

        wuchax = myEyesDistance / 2 + myEyesDistance;
        wuchay = myEyesDistance * 2 / 3 + myEyesDistance;

        if (myMidPoint.x - wuchax < 0) {//判断左边是否出界
            tx = 0;
        } else {
            tx = (int) (myMidPoint.x - wuchax);
        }
        if (myMidPoint.x + wuchax > width) {//判断右边是否出界
            bx = width;
        } else {
            bx = (int) (myMidPoint.x + wuchax);
        }
        if (myMidPoint.y - wuchay < 0) {//判断上边是否出界
            ty = 0;
        } else {
            ty = (int) (myMidPoint.y - wuchay);
        }
        if (myMidPoint.y + wuchay > height) {//判断下边是否出界
            by = height;
        } else {
            by = (int) (myMidPoint.y + wuchay);
        }

        try {
            return Bitmap.createBitmap(bitmap, tx, ty, bx - tx, by - ty);//这里可以自行调整裁剪宽高
        } catch (Exception e) {
            e.printStackTrace();
        }
//        }
        bitmap.recycle();
        return bitmap;
    }

    public static int findMaxIndex(float[] arr) {
        float max = 0;
        int maxIndex = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
                maxIndex = i;
            }
        }
        return maxIndex;
    }

}


//public final class FaceCj {
//    private static Options BitmapFactoryOptionsbfo;
//    private static ByteArrayOutputStream out;
//    private static byte[] data;
//    private static FaceDetector.Face[] myFace;
//    private static FaceDetector myFaceDetect;
//    private static int tx = 0;
//    private static int ty = 0;
//    private static int bx = 0;
//    private static int by = 0;
//    private static int width = 0;
//    private static int height = 0;
//    private static float wuchax = 0;
//    private static float wuchay = 0;
//    private static FaceDetector.Face face;
//    private static PointF myMidPoint;
//    private static float myEyesDistance;
//    private static List<String> facePaths;
//    private static String facePath;
//    public static Bitmap cutFace(Bitmap bitmap, Context context) {
//        facePaths = null;
//        BitmapFactoryOptionsbfo = new Options();
//        BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; // 构造位图生成的参数，必须为565。类名+enum
//        out = new ByteArrayOutputStream();
//        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);
//        data = out.toByteArray();
//        bitmap = decodeByteArray(data, 0, data.length,
//                BitmapFactoryOptionsbfo);
//        try {
//            out.flush();
//            out.close();
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//        width = bitmap.getWidth();
//        height = bitmap.getHeight();
//        myFace = new FaceDetector.Face[5]; // 分配人脸数组空间
//        myFaceDetect = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), 5);
//        int numberOfFaceDetected = myFaceDetect.findFaces(bitmap, myFace);
//        if (numberOfFaceDetected <= 0) {// FaceDetector构造实例并解析人脸
//            bitmap.recycle();
//            return null;
//        }
//        facePaths = new ArrayList<String>();
//        for (int i = 0; i < numberOfFaceDetected; i++) {
//            face = myFace[i];
//            myMidPoint = new PointF();
//            face.getMidPoint(myMidPoint);
//            myEyesDistance = face.eyesDistance();   //得到人脸中心点和眼间距离参数，并对每个人脸进行画框
//            wuchax = myEyesDistance / 2 + myEyesDistance;
//            wuchay = myEyesDistance * 2 / 3 + myEyesDistance;
//
//            if (myMidPoint.x - wuchax < 0) {//判断左边是否出界
//                tx = 0;
//            } else {
//                tx = (int) (myMidPoint.x - wuchax);
//            }
//            if (myMidPoint.x + wuchax > width) {//判断右边是否出界
//                bx = width;
//            } else {
//                bx = (int) (myMidPoint.x + wuchax);
//            }
//            if (myMidPoint.y - wuchay < 0) {//判断上边是否出界
//                ty = 0;
//            } else {
//                ty = (int) (myMidPoint.y - wuchay);
//            }
//            if (myMidPoint.y + wuchay > height) {//判断下边是否出界
//                by = height;
//            } else {
//                by = (int) (myMidPoint.y + wuchay);
//            }
//
//            try {
//                return Bitmap.createBitmap(bitmap, tx, ty, bx - tx, by - ty+5);//这里可以自行调整裁剪宽高
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//        bitmap.recycle();
//        return bitmap;
//    }
//
//}
